package co.com.bean.datosmaestro;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;

import co.com.smart.maestro.infraestructure.dto.DatosMaestroDTO;
import co.com.smart.maestro.infraestructure.dto.ResponseJson;
import co.com.smart.mapper.Mapper;
import co.com.smart.persistence.entity.DatosMaestroFacadeLocal;
import co.com.smart.persistence.entity.dto.SmartDatosMaestro;
import co.com.smart.session.DelegateContextEJB;
import co.com.smart.utilidades.Constantes;

/**
 * Session Bean implementation class DatosMaestroBean
 */
@Stateless(mappedName = "ejb/DatosMaestroBean")
public class DatosMaestroBean implements DatosMaestroBeanLocal{
	private DatosMaestroFacadeLocal facade;
	
	public DatosMaestroBean(){
		facade = DelegateContextEJB.getDatosMaestroFacadeLocal();
	}
	
	

	@Override
	public ResponseJson insertarDatosMaestro(DatosMaestroDTO datosMaestroDTO) {

		ResponseJson response = new ResponseJson(); 
		try {
			facade.create(Mapper.mapperDtoToSmartDatosMaestro(datosMaestroDTO));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos Maestro almacenado.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos Maestro almacenado.");
		} catch (Throwable e) {
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible almacenar el dato maestro.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}

		return response ;
	}
	
	@Override
	public List<DatosMaestroDTO> consultarAllDatosMaestro(){
		List<DatosMaestroDTO> datosmaestro = new ArrayList<DatosMaestroDTO>();
		for (SmartDatosMaestro entity : facade.findAll()) {
			if(entity.getSmfhretiro() == null){
				datosmaestro.add(Mapper.mapperSmartDatosMaestroToDto(entity));
			}
		}

		return datosmaestro;
	}

	@Override
	public DatosMaestroDTO consultarDatosMaestroId(DatosMaestroDTO datosMaestroDTO) {
		DatosMaestroDTO datosmaestro = new DatosMaestroDTO();
		
		SmartDatosMaestro entity  = facade.find(datosMaestroDTO.getScdatmestro());
		if(entity != null && entity.getSmfhretiro() == null){
			datosmaestro = Mapper.mapperSmartDatosMaestroToDto(entity);
		}
		return datosmaestro;
	}

	@Override
	public ResponseJson editDatosMaestro(DatosMaestroDTO datosmaestro) {
		ResponseJson response = new ResponseJson(); 
		try {
			datosmaestro.setFhmodificacion(new Date());
			facade.edit(Mapper.mapperDtoToSmartDatosMaestro(datosmaestro));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos Maestro editado.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos Maestro editado.");
		} catch (Throwable e) {
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible editar el dato maestro.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}

		return response ;
	}

	@Override
	public ResponseJson removeDatosMaestro(DatosMaestroDTO datosmaestro,  boolean logic) {
		ResponseJson response = new ResponseJson(); 
		if(logic){
			try {
				datosmaestro.setFhretiro(new Date());
				datosmaestro.setFhmodificacion(new Date());
				facade.edit(Mapper.mapperDtoToSmartDatosMaestro(datosmaestro));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos Maestro inactivado");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos Maestro inactivado.");
			} catch (Throwable e) {
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible inactivar el dato maestro.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}else{
			try {
				facade.remove(Mapper.mapperDtoToSmartDatosMaestro(datosmaestro));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos Maestro eliminado");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos Maestro eliminado.");
			} catch (Throwable e) {
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible eliminar el dato maestro.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}
		return response ;
	}

	@Override
	public List<DatosMaestroDTO> filtrardatosmaestroxmaestro(DatosMaestroDTO datosMaestro){
		List<DatosMaestroDTO> finddatosmaestro = new ArrayList<DatosMaestroDTO>();
		for (SmartDatosMaestro entity : facade.filtrardatosmaestroxmaestro(Mapper.mapperDtoToSmartDatosMaestro(datosMaestro))) {
			if(entity.getSmfhretiro() == null){
				finddatosmaestro.add(Mapper.mapperSmartDatosMaestroToDto(entity));
			}
		}
		return finddatosmaestro;
	}

}
